package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;

public class AfficherAlbum {
	/* identifiant de l'album à afficher */
	private int idAlbum;
	
	/* Variables nécessaires à l'affichage */
	Shell shell = null;
	private Display display = null;
	private Table table;
	private Label lblTitre_1;
	private Label lblSoustitre_1;
	private Label lblEstpartage;
	private Label lblPartage;
	private Button btnSeConnecter;
	private Label lblVousNtesPas;
	private Button stats;
	private Label lblPreface;
	private Label lblPostface;
	private Label lblCouverture;
	private Label lblCouverture_1;
	private StyledText stPreface;
	private StyledText stPostface;
	
	/**
	 * Constructeur de la classe, initialise uniquement
	 * l'écran à utiliser pour afficher la fenêtre
	 */
	public AfficherAlbum(){
		display = MainApp.display;
	}
	
	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(int idAlbum){
		this.idAlbum = idAlbum;
		if(shell == null || shell.isDisposed()){
			run();
		}else{
			rafraichir();
			shell.setActive();
		}
	}
	
	/**
	 * Cette fonction a pour but d'initialiser la fenêtre.
	 * Elle se termine en l'affichant avec des valeurs mises
	 * à jour depuis la base de données.
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){

		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX);		// Crée une fenêtre non redimensionnable
		shell.setSize(968, 365);
		shell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent arg0) {
				MainApp.consult.setActive();
			}
		});
		shell.setImage(MainApp.icone);
		
		btnSeConnecter = new Button(shell, SWT.NONE);
		btnSeConnecter.setBounds(872, 10, 80, 25);
		btnSeConnecter.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				if(MainApp.idClient == 0)
					MainApp.conn.setActive();
				else
					MainApp.conn.deconnecter();
			}
		});
		
		lblVousNtesPas = new Label(shell, SWT.NONE);
		lblVousNtesPas.setBounds(359, 15, 507, 15);
		lblVousNtesPas.setAlignment(SWT.RIGHT);
		
		Button btnRetourLa = new Button(shell, SWT.NONE);
		btnRetourLa.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				shell.dispose();
			}
		});
		btnRetourLa.setBounds(10, 10, 133, 25);
		btnRetourLa.setText("Retour à la consultation");
		
		stats = new Button(shell, SWT.NONE);
		stats.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.stats.setActive();
			}
		});
		stats.setText("Afficher les statistiques");
		stats.setBounds(153, 10, 200, 25);
		
		Label label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
		label.setBounds(0, 41, 962, 15);
		
		Label lblTitre = new Label(shell, SWT.NONE);
		lblTitre.setBounds(10, 62, 75, 15);
		lblTitre.setText("Titre :");
		lblTitre_1 = new Label(shell, SWT.NONE);
		lblTitre_1.setBounds(91, 62, 861, 15);
		lblTitre_1.setText("titre");
		
		Label lblSoustitre = new Label(shell, SWT.NONE);
		lblSoustitre.setBounds(10, 83, 75, 15);
		lblSoustitre.setText("Sous-titre :");
		lblSoustitre_1 = new Label(shell, SWT.NONE);
		lblSoustitre_1.setBounds(91, 83, 861, 15);
		lblSoustitre_1.setText("sous-titre");
		
		lblPartage = new Label(shell, SWT.NONE);
		lblPartage.setBounds(10, 104, 75, 15);
		lblPartage.setText("Partagé :");
		lblEstpartage = new Label(shell, SWT.NONE);
		lblEstpartage.setBounds(91, 104, 861, 15);
		
		lblCouverture = new Label(shell, SWT.NONE);
		lblCouverture.setText("Couverture :");
		lblCouverture_1 = new Label(shell, SWT.NONE);
		
		lblPreface = new Label(shell, SWT.NONE);
		lblPreface.setText("Préface :");
		stPreface = new StyledText(shell, SWT.BORDER);
		stPreface.setEditable(false);

		table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		TableColumn tblclmnTitre = new TableColumn(table, SWT.NONE);
		tblclmnTitre.setWidth(306);
		tblclmnTitre.setText("Titre");
		
		TableColumn tblclmnCommentaire = new TableColumn(table, SWT.NONE);
		tblclmnCommentaire.setWidth(298);
		tblclmnCommentaire.setText("Commentaire");
		
		TableColumn tblclmnCheminDaccs = new TableColumn(table, SWT.NONE);
		tblclmnCheminDaccs.setWidth(330);
		tblclmnCheminDaccs.setText("Chemin d'accès");
		
		lblPostface = new Label(shell, SWT.NONE);
		lblPostface.setText("Postface :");
		stPostface = new StyledText(shell, SWT.BORDER);
		stPostface.setEditable(false);
		
		rafraichir();
		if(!shell.isDisposed())
			shell.open();
	}
	
	/**
	 * Cette fonction récupère les informations sur l'album
	 * à partir de idAlbum prédéfini et met à jour les
	 * champs de la fenêtre
	 */
	public void rafraichir(){
		Statement stmt;
		
		table.removeAll();
		if(MainApp.estAdmin)
			stats.setVisible(true);
		else
			stats.setVisible(false);
		if(MainApp.idClient != 0){
			btnSeConnecter.setText("Déconnexion");
			lblVousNtesPas.setText(MainApp.prenom + " " + MainApp.nom);
		}else{
			btnSeConnecter.setText("Se connecter");
			lblVousNtesPas.setText("Vous n'êtes pas connecté");
		}
		
		try {
			stmt = JDBC.getInstance().getStatement();
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			
			// On sélectionne le livre ou l'album qui a le numéro idAlbum
			// pour récupérer ses information basiques (tout sauf les photos)
			String req = "SELECT titre, sousTitre, partage, idClient, preface, postface, chemin, l.idAlbum FROM Album a LEFT JOIN (SELECT idAlbum, preface, postface, chemin FROM Livre, Photo WHERE Photo.idPhoto = Livre.idPhoto) l  ON a.idAlbum=l.idAlbum WHERE a.idAlbum = " + idAlbum;
			ResultSet rset = stmt.executeQuery(req);
			if (rset.next()){
				lblTitre_1.setText(rset.getString(1));
				shell.setText(lblTitre_1.getText());
				
				if(rset.getString(2) != null)
					lblSoustitre_1.setText(rset.getString(2));
				else
					lblSoustitre_1.setText("");
				
				
				if(MainApp.idClient == rset.getInt(4)){ // Cas où le client est propriétaire
					lblPartage.setVisible(true);
					lblEstpartage.setVisible(true);
					lblEstpartage.setText((rset.getString(3).equalsIgnoreCase("o") ? "Oui" : "Non"));
					
					if(rset.getString(8) != null){ // Livre
						shell.setSize(968, 840);
						lblCouverture.setBounds(10, 125, 75, 15);
						lblCouverture.setVisible(true);
						lblCouverture_1.setBounds(91, 125, 500, 15);
						lblCouverture_1.setText(rset.getString(7));
						lblCouverture_1.setVisible(true);
						lblPreface.setBounds(10, 146, 75, 15);
						lblPreface.setVisible(true);
						stPreface.setBounds(10, 167, 942, 200);
						if(rset.getString(5) != null)
							stPreface.setText(rset.getString(5));
						else
							stPreface.setText("");
						stPreface.setVisible(true);
						table.setBounds(10, 373, 942, 201);
						lblPostface.setBounds(10, 580, 75, 15);
						lblPostface.setVisible(true);
						stPostface.setBounds(10, 601, 942, 200);
						if(rset.getString(6) != null)
							stPostface.setText(rset.getString(6));
						else
							stPostface.setText("");
						stPostface.setVisible(true);
					}else{ // Album
						lblCouverture.setVisible(false);
						lblCouverture_1.setVisible(false);
						lblPreface.setVisible(false);
						stPreface.setVisible(false);
						table.setBounds(10, 125, 942, 201);
						lblPostface.setVisible(false);
						stPostface.setVisible(false);
						shell.setSize(968, 365);
					}
				}else{ // Le client n'est pas propriétaire
					if(rset.getString(3).equalsIgnoreCase("n")){
						if (!MainApp.stats.estLance()
								&& !MainApp.modAlbum.estLance()
								&& !MainApp.commander.estLance()
								&& !MainApp.consult.estLance()
								&& !MainApp.creationA.estLance()
								&& !MainApp.creationL.estLance())
							MainApp.consult.setActive();
						shell.dispose();
						return;
					}
					lblPartage.setVisible(false);
					lblEstpartage.setVisible(false);

					if(rset.getString(8) != null){ // Livre
						shell.setSize(968, 840);
						lblCouverture.setBounds(10, 104, 75, 15);
						lblCouverture.setVisible(true);
						lblCouverture_1.setBounds(91, 104, 500, 15);
						lblCouverture_1.setText(rset.getString(7));
						lblCouverture_1.setVisible(true);
						lblPreface.setBounds(10, 125, 75, 15);
						lblPreface.setVisible(true);
						stPreface.setBounds(10, 146, 942, 200);
						if(rset.getString(5) != null)
							stPreface.setText(rset.getString(5));
						else
							stPreface.setText("");
						stPreface.setVisible(true);
						table.setBounds(10, 352, 942, 222);
						lblPostface.setBounds(10, 580, 75, 15);
						lblPostface.setVisible(true);
						stPostface.setBounds(10, 601, 942, 200);
						if(rset.getString(6) != null)
							stPostface.setText(rset.getString(6));
						else
							stPostface.setText("");
						stPostface.setVisible(true);
					}else{ // Album
						lblCouverture.setVisible(false);
						lblCouverture_1.setVisible(false);
						lblPreface.setVisible(false);
						stPreface.setVisible(false);
						table.setBounds(10, 104, 942, 222);
						lblPostface.setVisible(false);
						stPostface.setVisible(false);
						shell.setSize(968, 365);
					}
				}
			}
			// On sélectionne les photos de l'album ou du livre
			req = "SELECT titre, commentaire, chemin FROM Contient c, Photo p WHERE c.idAlbum = " + idAlbum + " AND c.idPhoto = p.idPhoto ORDER BY c.numPlace";
			rset = stmt.executeQuery(req);
			while (rset.next()){
				TableItem tableItem = new TableItem(table, SWT.NONE);
				tableItem.setText(new String[]{rset.getString(1), rset.getString(2), rset.getString(3)});
			}
			
			stmt.executeUpdate("COMMIT");
			rset.close();
			stmt.close();
		} catch (SQLException e) {
			MainApp.erreurBase(e.getMessage());
		}
	}
	
	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
}
